/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.ExamenComplementarioFisica;
import hibernate.objeto.CinecoronoariografiaEstudioCardiologia;
import hibernate.objeto.DeterminacionesEstudioLaboratorio;
import hibernate.objeto.EcgEstudioCardiologia;
import hibernate.objeto.EcocardiogramaEstudioCardiologia;
import hibernate.objeto.EcoestressEstudioCardiologia;
import hibernate.objeto.ElectrofisiologicoEstudioCardiologia;
import hibernate.objeto.ErgometriaEstudioCardiologia;
import hibernate.objeto.EstudioCardiologia;
import hibernate.objeto.EstudioLaboratorio;
import hibernate.objeto.ExamenComplementario;
import hibernate.objeto.HolterDePresionEstudioCardiologia;
import hibernate.objeto.HolterEstudioCardiologia;
import hibernate.objeto.Paciente;
import hibernate.objeto.TilTestEstudioCardiologia;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Rafael
 */
public class ExamenComplementarioLogica extends CapaLogica{

    /**
     * Crea y persiste el examen complementario para el paciente.
     *
     * @param datosExamenComplementario Los datos correspondientes al examen
     * complementario
     * @param paciente El paciente a quien se le carga el examen complementario
     * @param examenComplementario El examen complementario que se esta agregando/modificando
     * @param idObjetoCreado El id del objeto creado para su posterior recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarExamenComplementario(
            Object[] datosExamenComplementario, Paciente paciente,
            ExamenComplementario examenComplementario, int[] idObjetoCreado) {

            //Si es una modificacion
            if (idObjetoCreado[0] != -1) {
                //Escribe el log
                backUpModificacion(idObjetoCreado[0]);
                //Quita los estudios que antes puedo poseer
                quitarEstudiosAnteriores(examenComplementario);
                
            }

        examenComplementario = crearUObtenerObjetoExamenComplementario(
                datosExamenComplementario, paciente, examenComplementario);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(examenComplementario)) {
            
            idObjetoCreado[0] = examenComplementario.getIdExamenComplementario();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto complementario con los datos pasados por parámetro.
     *
     * @param datosExamenComplementario Los datos a cargar
     * @param paciente El paciente a quien se le carga el examen complementario
     * @param examenComplementario El examen que se esta creando/obteniendo
     * @return El objeto ExamenComplementario creado
     */
    private static ExamenComplementario crearUObtenerObjetoExamenComplementario(
            Object[] datosExamenComplementario, Paciente paciente, 
            ExamenComplementario examenComplementario){
        if(examenComplementario == null) {
            examenComplementario = new ExamenComplementario();
        }

        examenComplementario.setPaciente(paciente);

        examenComplementario.setHoraExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_HORA].toString());

        examenComplementario.setFechaExamenComplementario(
                (Date) datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_FECHA]);

        examenComplementario.setOrigenExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_ORIGEN].toString());

        examenComplementario.setAreaExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_AREA].toString());

        examenComplementario.setNombreExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_NOMBRE].toString());

        examenComplementario.setProtocoloExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_PROTOCOLO].toString());

        if (!datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_ADJUNTO].toString().equals("")
                && datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_ADJUNTO].toString().contains("\\")) {
            String rutaAdjuntoArreglada =
                    reemplazarUnaBarraInvertidaPorDosBarrasInvertidas(
                    datosExamenComplementario[
                    EXAMEN_COMPLEMENTARIO_ADJUNTO].toString());

            File file = new File(rutaAdjuntoArreglada);
            byte[] bFile = new byte[(int) file.length()];
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                //convert file into array of bytes
                fileInputStream.read(bFile);
                fileInputStream.close();
            } catch (Exception exc) {
                System.err.println(exc.getMessage());
            }
            examenComplementario.setNombreArchivoAdjuntoExamenComplementario(
                    file.getName());
            examenComplementario.setArchivoAdjuntoExamenComplementario(bFile);
        } else if (datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_ADJUNTO].toString().equals("")){ //Si no posee adjunto, se setean los datos de adjunto en null
            examenComplementario.setNombreArchivoAdjuntoExamenComplementario(
                    null);
            examenComplementario.setArchivoAdjuntoExamenComplementario(null);
        }

        examenComplementario.setDetalleExamenComplementario(
                datosExamenComplementario[
                EXAMEN_COMPLEMENTARIO_DETALLE].toString());

        return examenComplementario;
    }

    

    /**
     * Retorna el objeto ExamenComplementario según el id.
     *
     * @param idExamenComplementario El id del examen complementario
     * @return El objeto ExamenComplementario consultado, null si no existe
     */
    public static ExamenComplementario getExamenComplementarioPorId(
            int idExamenComplementario) {
        return ExamenComplementarioFisica.getExamenComplementarioPorId(
                idExamenComplementario);
    }

    /**
     * Retorna el vector de objetos ExamenComplementario correspondientes a un
     * paciente.
     *
     * @param idPaciente El id del paciente consultado
     * @return El vecotr de objetos ExamenComplementario consultado, null si
     * no existe
     */
    public static Vector<ExamenComplementario> getVectorExamenComplementarioPorIdPaciente(
            int idPaciente) {
        return ExamenComplementarioFisica.getVectorExamenComplementarioPorIdPaciente(
                idPaciente);
    }

    /**
     * Setea a un examen complementario el respectivo estudio correspondiente.
     * Puede ser de cardiologia o laboratorio, eliminando previamente cualquier
     * estudio que halla poseído anteriormente
     *
     * @param examenComplementario El examen complementario
     * @param idEstudioCardiologiaCreado El id del estudio cardiologia
     * @param idEstudioLaboratorioCreado El id del estudio laboratorio
     * @return
     */
    public static boolean setearEstudioCardiologico(
            ExamenComplementario examenComplementario,
            int[] idEstudioCardiologiaCreado,
            int[] idEstudioLaboratorioCreado) {

        if (idEstudioCardiologiaCreado[0] != -1) {
            //si se setea un estudio cardiologia
            examenComplementario.setEstudioCardiologia(
                        EstudioCardiologiaLogica.getEstudioCardiologiaPorId(
                        idEstudioCardiologiaCreado[0]));

        } else if (idEstudioLaboratorioCreado[0] != -1){
            //si se setea un estudio laboratorio
            examenComplementario.setEstudioLaboratorio(
                        EstudioLaboratorioLogica.getEstudioLaboratorioPorId(
                        idEstudioLaboratorioCreado[0]));
        }
         //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(examenComplementario)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Quita los objetos de estudios asociados al examen complementario de
     * manera fisica y logica.
     *
     * @param examenComplementario El examen al cual se le quitaran los estudios
     */
    private static void quitarEstudiosAnteriores(ExamenComplementario
            examenComplementario) {
        //se quitan los estudios anteriores a la carga o modificacion
        if (examenComplementario.getEstudioLaboratorio() != null) {
            //Obtengo todas las determinaciones
            Vector<DeterminacionesEstudioLaboratorio>
                vectorDeterminacionesEstudioLaboratorio =
                DeterminacionesEstudioLaboratorioLogica.
                getVectorDeterminacionesEstudioLaboratorioPorIdEstudioLaboratorio(
                examenComplementario.getEstudioLaboratorio().getIdEstudioLaboratorio());
                if (vectorDeterminacionesEstudioLaboratorio != null) {
                //Quito las determinaciones del objeto asociado y las elimino de
                //la bd
                examenComplementario.getEstudioLaboratorio().
                        setDeterminacionesEstudioLaboratorios(null);
                CapaFisica.deleteAll(vectorDeterminacionesEstudioLaboratorio);
                }
                //Se quita el estudio laboratorio al examen complementario y
                //elimino dicho estudio de la bd
                EstudioLaboratorio estudioLaboratorioElimado =
                        examenComplementario.getEstudioLaboratorio();
                examenComplementario.setEstudioLaboratorio(null);

                CapaFisica.eliminarObjeto(estudioLaboratorioElimado);

        } else if (examenComplementario.getEstudioCardiologia() != null) {

            //Se quita cada estudio correspondiente a un estudio cardiologico

            if (examenComplementario.getEstudioCardiologia().getEcgEstudioCardiologia() != null) {
                EcgEstudioCardiologia ecgEstudioCardiologiaEliminado = 
                        examenComplementario.getEstudioCardiologia().getEcgEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setEcgEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(ecgEstudioCardiologiaEliminado);
            } else if (examenComplementario.getEstudioCardiologia().getEcocardiogramaEstudioCardiologia() != null) {
                EcocardiogramaEstudioCardiologia ecocardiogramaEstudioCardiologiaEliminado =
                        examenComplementario.getEstudioCardiologia().getEcocardiogramaEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setEcocardiogramaEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(ecocardiogramaEstudioCardiologiaEliminado);
            } else if (examenComplementario.getEstudioCardiologia().getErgometriaEstudioCardiologia() != null) {
                ErgometriaEstudioCardiologia ergometriaEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getErgometriaEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setErgometriaEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(ergometriaEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getEcoestressEstudioCardiologia() != null) {
                EcoestressEstudioCardiologia ecoestressEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getEcoestressEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setEcoestressEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(ecoestressEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getHolterEstudioCardiologia()!= null) {
                HolterEstudioCardiologia holterEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getHolterEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setHolterEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(holterEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getHolterDePresionEstudioCardiologia() != null) {
                HolterDePresionEstudioCardiologia holterDePresionEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getHolterDePresionEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setHolterDePresionEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(holterDePresionEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getTilTestEstudioCardiologia() != null) {
                TilTestEstudioCardiologia tilTestEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getTilTestEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setTilTestEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(tilTestEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getElectrofisiologicoEstudioCardiologia() != null) {
                ElectrofisiologicoEstudioCardiologia electrofisiologicoEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getElectrofisiologicoEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setElectrofisiologicoEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(electrofisiologicoEstudioCardiologia);
            } else if (examenComplementario.getEstudioCardiologia().getCinecoronoariografiaEstudioCardiologia() != null) {
                CinecoronoariografiaEstudioCardiologia cinecoronoariografiaEstudioCardiologia =
                        examenComplementario.getEstudioCardiologia().getCinecoronoariografiaEstudioCardiologia();
                examenComplementario.getEstudioCardiologia().setCinecoronoariografiaEstudioCardiologia(null);
                CapaFisica.eliminarObjeto(cinecoronoariografiaEstudioCardiologia);
            }

            //Se quita el estudio cardiologia al examen complementario y
            //elimino dicho estudio de la bd
            EstudioCardiologia estudioCardiologiaEliminado =
                    examenComplementario.getEstudioCardiologia();
            examenComplementario.setEstudioCardiologia(null);

            CapaFisica.eliminarObjeto(estudioCardiologiaEliminado);
        }
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    ExamenComplementario.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        ExamenComplementario examenComplementario =
                ExamenComplementarioLogica.
                getExamenComplementarioPorId(idObjeto);
        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                examenComplementario.getArchivoLogExamenComplementario());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogExamenComplementario(examenComplementario, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        examenComplementario.setArchivoLogExamenComplementario(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param enfermedadYDiagnosticoAmbulatorio El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogExamenComplementario(
            ExamenComplementario examenComplementario, String rutaLog) {
        try {
            //ExamenComplementario
            String examenComplementarioString = getExamenComplementarioString(
                    examenComplementario);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            examenComplementarioString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(examenComplementarioString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto EnfermedadYDiagnosticoAmbulatorio en string.
     *
     * @param examenComplementario  El objeto a escribir
     */
    public static String getExamenComplementarioString(
            ExamenComplementario examenComplementario) {

        String examenComplementarioString =
                    "idExamenComplementario: " +
                    examenComplementario.getIdExamenComplementario() + "\n" +
                    "idPaciente: " +
                    examenComplementario.getPaciente().getIdPaciente() + "\n";

        if (examenComplementario.getEstudioCardiologia() != null) {
            examenComplementarioString +=
                    EstudioCardiologiaLogica.getEstudioCardiologiaString(
            examenComplementario.getEstudioCardiologia());
        } else if (examenComplementario.getEstudioLaboratorio() != null) {
            examenComplementarioString +=
                    EstudioLaboratorioLogica.getEstudioLaboratorioString(
            examenComplementario.getEstudioLaboratorio());
        }

        examenComplementarioString += "horaEnfermedadYDiagnosticoAmbulatorio: " +
        examenComplementario.getHoraExamenComplementario() + "\n" +
        "fechaEnfermedadYDiagnosticoAmbulatorio: " +
        examenComplementario.getFechaExamenComplementario() + "\n" +
        "origenExamenComplementario: " +
        examenComplementario.getOrigenExamenComplementario() + "\n" +
        "areaExamenComplementario: " +
        examenComplementario.getAreaExamenComplementario() + "\n" +
        "nombreExamenComplementario: " +
        examenComplementario.getNombreExamenComplementario() + "\n" +
        "protocoloExamenComplementario: " +
        examenComplementario.getProtocoloExamenComplementario() + "\n" +
        "detalleExamenComplementario: " +
        examenComplementario.getDetalleExamenComplementario() + "\n";

        if (examenComplementario.getArchivoAdjuntoExamenComplementario() != null) {
            examenComplementarioString += "nombreArchivoAdjuntoExamenComplementario: " +
            examenComplementario.getDetalleExamenComplementario() + "\n" +
            "archivoAdjunto: \n --- INICIO ARCHIVO ADJUNTO" +
            new String(examenComplementario.getArchivoAdjuntoExamenComplementario()) + "\n --- FIN ARCHIVO ADJUNTO\n";
        }

        return examenComplementarioString;
    }

    /**
     * Retorna todo el objeto EnfermedadYDiagnosticoAmbulatorio en HTML.
     *
     * @param examenComplementario  El objeto a escribir
     */
    public static String getExamenComplementarioHTML(
            ExamenComplementario examenComplementario) {
        String examenComplementarioHTML = "";
        String estudioCardiologiaHTML = "";
        String estudioLaboratorioHTML = "";        

        if (examenComplementario != null) {

            if (examenComplementario.getEstudioCardiologia() != null) {
                estudioCardiologiaHTML += "</font><br><br><hr /><hr /><br>";
                estudioCardiologiaHTML += EstudioCardiologiaLogica.getEstudioCardiologiaHTML(
                        examenComplementario.getEstudioCardiologia());
            } else if (examenComplementario.getEstudioLaboratorio() != null) {
                estudioLaboratorioHTML += "</font><br><br><hr /><hr /><br>";
                estudioLaboratorioHTML += EstudioLaboratorioLogica.getEstudioLaboratorioHTML(
                        examenComplementario.getEstudioLaboratorio());
            }

        examenComplementarioHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">EXAMEN COMPLEMENTARIO</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(examenComplementario.
                    getFechaExamenComplementario()) + " - " +
                    examenComplementario.getHoraExamenComplementario() + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Orígen: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    examenComplementario.getOrigenExamenComplementario() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Área: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    examenComplementario.getAreaExamenComplementario() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Nombre: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    examenComplementario.getNombreExamenComplementario() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Protocolo: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    examenComplementario.getProtocoloExamenComplementario() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Detalle: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    examenComplementario.getDetalleExamenComplementario() +
                    estudioCardiologiaHTML +
                    estudioLaboratorioHTML + "</font><br><br>";
        } else {
            examenComplementarioHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">EXAMEN COMPLEMENTARIO</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }
        return examenComplementarioHTML;
    }
}
